package com.arron.juc;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Classname CASDemo
 * @Description TODO
 * @Date 2020/8/20 18:36
 * @Created by 刘
 */

/**
 *  CAS 是什么？
 *  compareAndSet ，比较并交换，传入的值是期望的值，如果相等则修改为 update值
 *  返回修改是否成功
 *  底层是调用本地方法，是一条cpu并发原语，是一条原子命令，并发原语是连续的，不可能被打断
 *  优点：
 *      不加锁保证了数据的一致性，提高了并发量
 *  缺点：
 *      1.自选过程，循环开销大
 *      2.只能保证一个共享变量的原子性
 *      3.ABAB问题
 */
public class CASDemo {

    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger();
        System.out.println(atomicInteger.intValue());
//        atomicInteger.incrementAndGet()
        //比较并交换
        System.out.println(atomicInteger.compareAndSet(0, 2019));
        atomicInteger.getAndIncrement();
        System.out.println(atomicInteger.intValue());
    }



}
